/**
 * @file Vite配置文件监听插件
 * @description 监听vite目录下文件的变化，当文件发生变化时重新加载Electron应用
 * @author 黄敏
 * @创建时间 2025-07-01
 */

import type { Plugin } from 'vite'
import { resolve } from 'node:path'

/**
 * 创建Vite配置文件监听插件
 * @param reloadCallback - 重新加载回调函数
 * @returns Vite插件
 */
export function createViteConfigWatcherPlugin(
  reloadCallback: (onlyClose?: boolean) => void
): Plugin {
  return {
    name: 'vite-config-watcher',
    apply: 'serve', // 只在开发模式下应用

    buildStart() {
      console.log('🔍 Vite config watcher plugin initialized')

      // 添加 vite 目录到监听列表
      const viteDir = resolve(process.cwd(), 'vite')
      const viteConfig = resolve(process.cwd(), 'vite.config.mts')

      this.addWatchFile(viteDir)
      this.addWatchFile(viteConfig)
    },

    configureServer(server) {
      let isViteRestarting = false

      // 使用 Vite 的内置文件监听器
      server.watcher.on('change', file => {
        const normalizedFile = file.replace(/\\/g, '/')

        if (normalizedFile.includes('vite/') || normalizedFile.includes('vite.config.')) {
          console.log(`📝 Vite config file changed: ${normalizedFile}`)

          // 检查是否是配置文件变化（会导致 Vite 重启）
          if (normalizedFile.includes('vite.config.')) {
            console.log('⚠️ Vite config changed, Vite will restart. Closing Electron app...')
            isViteRestarting = true
            // 仅关闭 Electron，让 Vite 重启后重新启动
            reloadCallback(true)
          } else {
            console.log('🔄 Reloading Electron app due to vite directory change...')
            // vite 目录下的文件变化，直接重启 Electron
            setTimeout(() => {
              reloadCallback()
            }, 100)
          }
        }
      })

      // 监听 Vite 服务器关闭事件
      const originalClose = server.close.bind(server)
      server.close = async () => {
        if (!isViteRestarting) {
          console.log('⚠️ Vite server is closing, shutting down Electron app...')
          reloadCallback(true) // 传入 true 表示仅关闭，不重启
        }
        return originalClose()
      }

      // 监听进程退出事件（只在非重启情况下关闭 Electron）
      const handleProcessExit = (signal: string) => {
        if (!isViteRestarting) {
          console.log(`⚠️ Received ${signal}, closing Electron app...`)
          reloadCallback(true)
        }
      }

      process.on('SIGINT', () => handleProcessExit('SIGINT'))
      process.on('SIGTERM', () => handleProcessExit('SIGTERM'))
    }
  }
}
